数据库基础

吴龙淼 写于 2021-07-16

SQL 基本查询

select指定要查询的列 distinct过滤完全重复行  as别名可省略 from 指定表 where
group by
order by
列可以简单的运算
别名可以用中文,需要区分大小写、包含特殊字符需要""
||数据连接操作符,连接字符需要''

where
以下运算只能判断一次,多个限定符需要AND OR NOT
关系运算:> < = <= >= !=
范围运算:between...and单个运算符效率高   >= AND <=
空判断:null is not null
in判断(点):in(a,b,c...) not in查询结果包含null,不返回任何值,in无此限制 exists()
模糊查询:like  not like  匹配任意一位_  匹配任意位数%

排序
order by
升序:ASC,默认
降序:DESC
混合排序:先写优先级高

数据扩增

内连接:
a join b on a.aa=b.bb(等值连接)
         a.aa between b.aa and b.cc(非等值连接)

外连接:
左外连接 a left join b on
右外连接 a right join b on

多表连接:
a right join b on join c on

数据集合操作(查询必须具有相同的数据结构)
union 并集
minus(EXCEPT) 差集
intersect 交集

内置函数

函数结构: 返回值 函数名(列 | 数据)
虚拟表:dual
decode(条件,a,result,b,result)

通用函数:
null处理函数 nvl(a,b)如果a为null,NVL返回值为b的值,否则返回a的值
多数值判断 行内数据重命名 decode(列,匹配内容,改名内容)

字符串函数:
大小写转换函数 UPPER() LOWER()
首字母大写 initcap()
计算字符串长度length()
字符串替换replace(列,old,new)
字符串截取substr() 下标从1开始[a,b]

数值函数:
四舍五入round(num,保留位数)
截取小数,不进位trunc()
取模mod(a,b) a/b

转换函数:
FM999,999,999,999,999,990.00
 ①其9代表:如果存在数字则显示数字,不存在则显示空格。
 ②其0代表:如果存在数字则显示数字,不存在则显示0,即占位符。
 ③其FM代表:删除如果是因9带来的空格,则删除之。
to_char(要转换的数据,转换格式) 年yyyy 月mm 日dd 时hh 分mi 秒ss
to_date(要转换的数据,转换格式)
to_number()

日期函数:(oracle特有)
数据伪列:不存在表中,但是能进行查询 sysdate当前时间
日期+-n 数字表示n天前后的日期
日期-日期 日期间的天数
计算月份a-b month_between(a,b)
add_months(列,num)
指定日期所在月的最后一天last_day()
计算下一个指定日期next_day(列,一周时间数)

统计函数:
max()
min()
avg()
sum()
count()

子查询

  where型子查询:指把内部查询的结果作为外层查询的比较条件。
  from型子查询:把内层的查询结果当成临时表,供外层sql再次查询。
  in子查询:内层查询语句仅返回一个数据列,这个数据列的值将供外层查询语句进行比较。
  exists子查询:把外层的查询结果,拿到内层,看内层是否成立,简单来说后面的返回true,外层(也就是前面的语句)才会执行,否则不执行。
  any子查询:只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。
  all子查询:内层子查询返回的结果需同时满足所有内层查询条件。
  比较运算符子查询:子查询中可以使用的比较运算符如 “>” “<” “= ” “!=”



// gdp大于平均值的城市
SELECT city FROM test
WHERE gdp > (
  SELECT avg(gdp) from test
)

// 找到每个城市最大gdp的区域
SELECT area FROM test
WHERE gdp IN (
  SELECT max(gdp) from test
  GROUP BY city
)

// 关联子查询,外层查询先执行,找到gdp大于按城市分组平均值的城市
SELECT * FROM test as t1 where gdp > (
  select avg(gdp) from test as t2 where t1.city = t2.city
  group by city
)

分组聚合

group by

1、如果查询不使用GROUP BY 子句,那么SELECT 子句中只允许出现统计函数,其他任何字段不允许出现。
2、如果查询中使用了GROUP BY 子句,那么SELECT子句中只允许出现分组字段、统计函数、其他字段都不允许出现。
3、统计函数嵌套后不能包含  任何字段,包含分组字段

having 分组过滤,没有group by不可使用

数据更新

增加:
insert into tableName(columnName...) values () () ()...

更改:
update tableName set a=,b=... where

删除:
delete from  tableName where

数据表创建和删除

创建:create table name (
    列名  数据类型
    ...
);

表约束:
NOT NULL 非空
UNIQUE  唯一
PRIMARY KEY 主键
FOREIGN KEY 外键
default 默认约束
CHECK 检查约束

删除:回收站 drop table name